package com.itqf.sms.service.impl;

import com.itqf.sms.dto.BillDto;
import com.itqf.sms.mapper.BillMapper;
import com.itqf.sms.mapper.ProviderMapper;
import com.itqf.sms.pojo.Bill;
import com.itqf.sms.pojo.Provider;
import com.itqf.sms.service.BillService;
import com.itqf.sms.vo.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * projectName: springboot_part
 *
 * @author: 赵伟风
 * time: 2021/9/23 15:13
 * description:账单接口的实现类
 */
@Service
public class BillServiceImpl implements BillService {

    @Autowired
    private BillMapper billMapper;

    @Autowired
    private ProviderMapper providerMapper;

    /**
     * 查询供应商业务方法
     *
     * @return
     */
    @Override
    public R providers() {

        List<Provider> providers = providerMapper.selectList(null);

        return R.OK("查询成功",providers);
    }

    /**
     * 查询账单业务方法
     *
     * @param billDto
     * @return
     */
    @Override
    public R list(BillDto billDto) {

        /*
           todo: mybatis-plus和mybatis是好基友!不做mybatis的修改,只做mybatis的增强
           todo: mybatis-plus通过mapper继承,实现了所有单表的curd操作!
           todo: mybatis-plus单表之王!

           todo: 如果是多表操作,我们还需要使用mybatis自行实现!
           todo: 实现步骤:
                 1. 创建mapper接口对应的mapper.xml实现文件
                 2. mapper.xml中要实现多表的查询和结果集的封装(resultMap)

           todo: 新技术
                 1. 如何向mapper.xml中传递参数 key pid state
                     单个变量: 只需要在mapper接口的方法的形参上!添加对应类型的变量即可!
                     演示: 1. List<Bill> queryBills(String key);
                          2. Mapper.xml中 #{形参名取值}
                     多个变量: 需要将变量封装到一个map或者一个实体对象中!将map或者实体对象设置为
                              mapper接口方法的形参类型即可!
                     演示: 1. 封装一个实体对象,内部包含你要传递的属性名
                          2. mapper接口的形参方法指定对象类型 List<Bill> queryBills(BillDto billDto);
                          3. mapper.xml中可以直接 #{对象属性名} 获取值!

                 2. 如何编写动态的sql语句

         */

        List<Bill> bills = billMapper.queryBills(billDto);

        return R.OK("查询成功",bills);
    }

    /**
     * 保存账单业务方法
     *
     * @param bill
     * @return
     */
    @Override
    public R save(Bill bill) {

        int rows = 0;
        try {
            rows =  billMapper.insert(bill);
        }catch (Exception e){

        }

        if (rows == 0){

            return R.FAIL("插入数据失败!参数异常!");
        }

        return R.OK("插入数据成功!");
    }

    /**
     * 修改账单业务方法
     *
     * @param bill
     * @return
     */
    @Override
    public R update(Bill bill) {

        int rows = 0;

        try {
            rows = billMapper.updateById(bill);
        }catch (Exception e){

        }

        if (rows == 0){

            return R.FAIL("修改数据失败!参数异常");
        }

        return R.OK("修改数据成功!");
    }

    /**
     * 删除账单业务方法
     *
     * @param bid
     * @return
     */
    @Override
    public R delete(int bid) {
        //mybatis-plus更新的时候,如果列对应的属性为null不会进行更新!
        //所以,建议实体类的属性的类型使用包装类型!
        Bill  bill = new Bill();
        bill.setBid(bid);
        bill.setDeleted(1);

        int row = billMapper.updateById(bill);

        return R.OK("数据删除成功!");
    }
}
